package com.ynet.middleground.contract.service.impl;

import java.util.List;

import javax.validation.Valid;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;

import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;

import com.google.common.base.Throwables;
import com.ynet.core.common.ServiceResult;
import com.ynet.core.exception.BusinessException;
import com.ynet.core.log.IfpLogger;
import com.ynet.middleground.contract.bean.AddTemplateParamsReq;
import com.ynet.middleground.contract.bean.DeleteTemplateParamReq;
import com.ynet.middleground.contract.bean.QueryTemplateParamsReq;
import com.ynet.middleground.contract.bean.UpdateTemplateParamReq;
import com.ynet.middleground.contract.dto.TemplateParamDTO;
import com.ynet.middleground.contract.model.TemplateParamModel;
import com.ynet.middleground.contract.service.TemplateParamsService;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;

/**
 * @author liulx
 * @description 模板参数处理相关接口服务实现类
 * @date 2020-03-18 22:16
 */
@Api(value = "模板参数处理相关接口服务", tags = {"模板参数处理相关接口服务"})
@Produces({MediaType.APPLICATION_JSON + "; " + "charset=UTF-8"})
@Consumes({MediaType.APPLICATION_JSON + "; " + "charset=UTF-8"})
@Path("template-params")
@Service(timeout = 6000, version = "0.0.1")
public class TemplateParamsServiceImpl implements TemplateParamsService, GenericService {

    @Autowired
    private TemplateParamModel templateParamModel;

    /**
     * 根据模板ID查询该模板参数列表信息
     *
     * @param queryTemplateParamsReq 查询模板参数请求类
     * @return 模板参数信息传输对象
     */
    @POST
    @Path("params")
    @ApiOperation(value = "查询模板参数信息", notes = "根据模板 id 查询该模板参数列表信息")
    @ApiImplicitParam(name = "requestObj", dataType = "QueryTemplateParamsReq", paramType = "body", required = true)
    @Override
    public ServiceResult<List<TemplateParamDTO>>
        queryTemplateParamsbyTemplateId(QueryTemplateParamsReq queryTemplateParamsReq) {
        ServiceResult<List<TemplateParamDTO>> result = new ServiceResult<>();
        try {
            result.setResult(templateParamModel.queryTemplateParamsByTemplateId(queryTemplateParamsReq));
        } catch (BusinessException be) {
            result.setError(be.getCode(), be.getMessage());
        } catch (Exception e) {
            IfpLogger.error(Thread.currentThread().getStackTrace()[1].getMethodName(), "查询模板参数服务异常, case: {}",
                Throwables.getStackTraceAsString(e));
            result.setError("ECCT0000", "服务异常，请联系系统管理员");
        }
        return result;
    }

    /**
     * 为指定模板添加模板参数信息
     *
     * @param addTemplateParamsReq 新增模板参数请求类
     * @return 结果标志，以 success 字段值标识 true/false
     */
    @POST
    @ApiOperation(value = "新增模板参数信息", notes = "为指定模板添加模板参数信息，只能为未启用状态的模板添加参数<br />该服务辅佐于维护模板信息，可用于单独维护模板参数")
    @ApiImplicitParam(name = "requestObj", dataType = "AddTemplateParamsReq", paramType = "body", required = true)
    @Override
    public ServiceResult addTemplateParams(AddTemplateParamsReq addTemplateParamsReq) {
        ServiceResult result = new ServiceResult<>();
        try {
            templateParamModel.addTemplateParams(addTemplateParamsReq);
        } catch (BusinessException be) {
            result.setError(be.getCode(), be.getMessage());
        } catch (Exception e) {
            IfpLogger.error(Thread.currentThread().getStackTrace()[1].getMethodName(), "新增模板参数服务异常, case: {}",
                Throwables.getStackTraceAsString(e));
            result.setError("ECCT0000", "服务异常，请联系系统管理员");
        }
        return result;
    }

    /**
     * 根据模板参数 id 修改参数信息
     *
     * @param updateTemplateParamReq 修改模板参数请求类
     * @return 结果标志，以 success 字段值标识 true/false
     */
    @PUT
    @Path("update")
    @ApiOperation(value = "修改模板参数信息", notes = "根据模板参数 id 修改参数信息<br />该服务辅佐于维护模板信息，可用于单独维护模板参数")
    @ApiImplicitParam(name = "requestObj", dataType = "UpdateTemplateParamReq", paramType = "body", required = true)
    @Override
    public ServiceResult updateParamById(UpdateTemplateParamReq updateTemplateParamReq) {
        ServiceResult result = new ServiceResult<>();
        try {
            templateParamModel.updateParamById(updateTemplateParamReq, false);
        } catch (BusinessException be) {
            result.setError(be.getCode(), be.getMessage());
        } catch (Exception e) {
            IfpLogger.error(Thread.currentThread().getStackTrace()[1].getMethodName(), "修改模板参数服务异常, case: {}",
                Throwables.getStackTraceAsString(e));
            result.setError("ECCT0000", "服务异常，请联系系统管理员");
        }
        return result;
    }

    /**
     * 删除指定模板参数信息
     *
     * @param deleteTemplateParamReq 删除模板参数请求类
     * @return 结果标志，以 success 字段值标识 true/false
     */
    @DELETE
    @ApiOperation(value = "删除模板参数信息", notes = "根据模板参数 id 删除模板参数信息<br />该服务辅佐于维护模板信息，可用于单独维护模板参数")
    @ApiImplicitParam(name = "requestObj", dataType = "DeleteTemplateParamReq", paramType = "body", required = true)
    @Override
    public ServiceResult deleteParamById(@Valid DeleteTemplateParamReq deleteTemplateParamReq) {
        ServiceResult result = new ServiceResult<>();
        try {
            templateParamModel.deleteTemplateParam(deleteTemplateParamReq);
        } catch (BusinessException be) {
            result.setError(be.getCode(), be.getMessage());
        } catch (Exception e) {
            IfpLogger.error(Thread.currentThread().getStackTrace()[1].getMethodName(), "删除模板参数服务异常, case: {}",
                Throwables.getStackTraceAsString(e));
            result.setError("ECCT0000", "服务异常，请联系系统管理员");
        }
        return result;
    }

}
